package br.np2tec.soa.servicos;


import java.util.Iterator;
import java.util.List;
import javax.jws.WebService;
import javax.xml.ws.WebServiceRef;


@WebService()
public class VerificarContratoRiscoService {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarPropostaCreditoDataServiceService/TratarPropostaCreditoDataService?WSDL")
    TratarPropostaCreditoDataServiceService tratarPropostaCreditoDataService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarCreditosConcedidosDataServiceService/TratarCreditosConcedidosDataService?WSDL")
    TratarCreditosConcedidosDataServiceService tratarCreditosConcedidosDataService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/VerificarLimiteCreditoService/VerificarLimiteCreditoServiceService?WSDL")
    VerificarLimiteCreditoServiceService verificarLimiteCreditoService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarTaxaContratoDataServiceService/TratarTaxaContratoDataService?WSDL")
    TratarTaxaContratoDataServiceService tratarTaxaContratoDataService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/CalcularTaxaContrato/CalcularTaxaContratoServiceService?WSDL")
    CalcularTaxaContratoServiceService calcularTaxaContratoService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarPropostaContratoDataServiceService/TratarPropostaContratoDataService?WSDL")
    TratarPropostaContratoDataServiceService tratarPropostaContratoDataService;

    @WebServiceRef(wsdlLocation = "http://localhost:8080/GerarPropostaContrato/GerarPropostaContratoServiceService?WSDL")
    GerarPropostaContratoServiceService gerarPropostaContratoService;

    public void reduzirRiscoContrato(PropostaCredito propostaCredito, List<Parcela> listaParcelas, Integer quantidadeImpressoes, Double quilometrosDistancia, Integer quantidadeAlteracoes) {
        //Invocar a operação 'alterarPropostaCredito' para atualizar o valor a ser financiado e o número de parcelas de acordo com os parâmetros recebidos
        tratarPropostaCreditoDataService.getTratarPropostaCreditoDataServicePort().alterarPropostaCredito(propostaCredito.getValorFinanciado(), propostaCredito.getNumeroParcelas(), propostaCredito.getResultadoVerificacao(), propostaCredito.getPecas(), propostaCredito.getNumeroProposta());

               //Deletar as parcelas cadastradas anteriormente e cadastrar as novas parcelas considerando o novo valor concedido e número de parcelas
        CreditosConcedidos creditosConcedidos = tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().consultarCreditosConcedidosPorIdPropostaCredito(propostaCredito.getId());
        List<Parcela> parcelas = creditosConcedidos.getParcelas();
        for (Parcela parcela : parcelas) {
            tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().excluirParcela(parcela);
        }
        
         /*
         *Invocar a operação 'alterarCreditosConcedidos'  para atualizar o valor concedido e o número de parcelas, de acordo com a nova proposta de crédito.
         * A situação deve ser alterada para "Comprometido" e a taxa de juros nula.
         */
        tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().alterarCreditosConcedidos(propostaCredito.getNumeroProposta(), "Comprometido", null, propostaCredito.getValorFinanciado(), propostaCredito.getNumeroParcelas(), listaParcelas);


        //Deletar as taxas correspondente ao contrato em vigor
        PropostaContrato propostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().consultarPropostaContratoPorIdCreditosConcedidos(creditosConcedidos.getId());
        List<TaxaContrato> listaTaxaContrato = tratarTaxaContratoDataService.getTratarTaxaContratoDataServicePort().consultarTaxaContratoPorIdPropostaContrato(propostaContrato.getId());
        for (TaxaContrato taxaContrato : listaTaxaContrato)
        {
            tratarTaxaContratoDataService.getTratarTaxaContratoDataServicePort().excluirTaxaContrato(taxaContrato);
        }
        
        //Invocar a operação 'calcularTaxasContrato' para gerar as novas taxas.
        //Considerar que houve alteração da proposta e a taxa de alteração deve ser acrescida de 1.
        calcularTaxaContratoService.getCalcularTaxaContratoServicePort().calcularTaxaContrato(quantidadeImpressoes, quilometrosDistancia, creditosConcedidos.getValorTotalConcedido(), quantidadeAlteracoes);


        //Invocar a operação 'determinarTaxaJurosCliente' para atualizar a nova taxa de juros a ser cobrada
        tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().determinarTaxaJurosCliente(propostaCredito.getNumeroProposta());

        //Deletar o contrato anterior e invocar a operação gerarPropostaContrato para geração do novo contrato
        tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().excluirPropostaContrato(propostaContrato.getNumeroContrato());
        gerarPropostaContratoService.getGerarPropostaContratoServicePort().gerarPropostaContrato(propostaCredito.getNumeroProposta(), propostaContrato.getNumeroContrato(), null , null);

    }

  
    //TODO implementação diferente da especificação. Recupera créditos concedidos a partir da proposta de contrato
    public boolean identificarContratoRisco(Integer numeroPropostaContrato) {

        PropostaContrato propostaContrato = tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().consultarPropostaContrato(numeroPropostaContrato);
        CreditosConcedidos creditosConcedidos = propostaContrato.getCreditosConcedidos();
        PropostaCredito propostaCredito = creditosConcedidos.getPropostaCredito();
        Cliente cliente = propostaCredito.getCliente();

        double limiteCredito = verificarLimiteCreditoService.getVerificarLimiteCreditoServicePort().verificarLimiteCredito(cliente.getCpf());

        //verifica a existência de pelo menos uma parcela corresponde a 90% ou mais do limite de crédito
        double limiteCreditoCalculado = limiteCredito * 0.9;
        double qtdCreditosConcedidosCliente = 0;

        if (propostaContrato != null) {
            List<Parcela> parcelas = creditosConcedidos.getParcelas();

            for (Parcela parcela : parcelas) {
                if (parcela.getValor() >= limiteCreditoCalculado) {
                    //Verifica os outros créditos já concedidos para o cliente
                    List listaPropostaCreditoCliente = tratarPropostaCreditoDataService.getTratarPropostaCreditoDataServicePort().listarPropostaCreditoPorCliente(cliente);
                    Iterator it = listaPropostaCreditoCliente.iterator();
                    while(it.hasNext()){
                        PropostaCredito propostaCreditoCliente = (PropostaCredito)it.next();
                    
                        List listaCreditosConcedidosCliente = tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().listarCreditosConcedidos(propostaCreditoCliente.getNumeroProposta());

                        Iterator itCreditosConcedidos = listaCreditosConcedidosCliente.iterator();
                        while(itCreditosConcedidos.hasNext()){
                        CreditosConcedidos creditosConcedidosCliente = (CreditosConcedidos) itCreditosConcedidos.next();

                        //[se existem 2 ou mais créditos concedidos com pelo menos 6 parcelas ainda não pagas]
                        int qtdParcelasEmAberto = tratarCreditosConcedidosDataService.getTratarCreditosConcedidosDataServicePort().verificarParcelasEmAberto(creditosConcedidosCliente.getParcelas());
                            if (qtdParcelasEmAberto >= 6) {
                                qtdCreditosConcedidosCliente++;
                                if (qtdCreditosConcedidosCliente >= 2) {
                                    //Identifica o contrato como sendo de risco
                                    //tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().alterarPropostaContrato(numeroPropostaContrato, "Contrato de Risco");
                                    tratarPropostaContratoDataService.getTratarPropostaContratoDataServicePort().alterarPropostaContrato(propostaContrato);
                                    return true;
                                }
                            }

                        }

                    }
                }
            }
        }
        return false;
    }
}
